package ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.SolicitudGastoDao;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.SolicitudGasto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Supervisor;

public class SolicitudGastoHibernateDao implements SolicitudGastoDao {
	private static SessionFactory sessionFactory = configureSessionFactory();
    private static org.hibernate.service.ServiceRegistry serviceRegistry;

      private static SessionFactory configureSessionFactory() throws HibernateException {
          Configuration configuration = new Configuration();
          configuration.configure();
          serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
          sessionFactory = configuration.buildSessionFactory(serviceRegistry);
          return sessionFactory;
      }

	@Override
	public SolicitudGasto persistir(SolicitudGasto solicitudGasto) {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.saveOrUpdate(solicitudGasto);
		session.getTransaction().commit();
		session.close();
		
		return solicitudGasto;
	}

	@Override
	public void eliminar(SolicitudGasto solicitudGasto) {
		// TODO Auto-generated method stub
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listar() {
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName());
		return query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPorEstado(String estado) {
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName() + " where slg_est = :estado");
		query.setParameter("estado", estado);
		return query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPorEmpleado(Empleado empleado) {
		Integer emp_id = empleado.getIdUsuario();
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName() + 
				" where slg_emp_id = :emp_id");
		query.setParameter("emp_id", emp_id);
		return query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPorEmpleadoYEstado(Empleado empleado,
			String estado) {
		Integer emp_id = empleado.getIdUsuario();
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName() + 
				" where slg_emp_id = :emp_id and slg_est = :estado");
		query.setParameter("emp_id", emp_id);
		query.setParameter("estado", estado);
		return query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPorSupervisor(Supervisor supervisor) {
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName() + " where slg_spv_id = :spv_id");
		query.setParameter("spv_id", supervisor.getIdUsuario());
		return query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPorSupervisorYEstado(
			Supervisor supervisor, String estado) {
		Integer spv_id = supervisor.getIdUsuario();
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName() + 
				" where slg_spv_id = :spv_id and slg_est = :estado");
		query.setParameter("spv_id", spv_id);
		query.setParameter("estado", estado);
		return query.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudGasto> listarPorCentroCosto(CentroCosto centroCosto) {
		@SuppressWarnings("unused")
		Integer cco_id = centroCosto.getIdCentroCosto();
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + SolicitudGasto.class.getName() + 
				" where slg_cco_id = :cco_id");
		return query.list();
	}

	@Override
	public SolicitudGasto cambiarEstado(SolicitudGasto solicitud,
			String nuevoEstado) {
		// TODO Auto-generated method stub
		return null;
	}

}
